/**
 * This file is part of Picasa Photo Uploader.
 *
 * Picasa Photo Uploader is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * Picasa Photo Uploader is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with Picasa Photo Uploader. If not, see <http://www.gnu.org/licenses/>.
 */
package com.android.picasaphotouploader;

import android.content.Context;
import android.content.SharedPreferences;
import android.net.ConnectivityManager;
import android.net.wifi.WifiManager;

/**
 * Check if internet connection is available
 *
 * @author Jan Peter Hooiveld
 */
public class CheckInternet
{
  /**
   * Singleton that refers to this class
   */
  private static CheckInternet instance;

  /**
   * Constant for Wi-FI setting from user preferences
   */
  private static final String CON_WIFI = "wifi";

  /**
   * Constructor
   */
  private CheckInternet() {}

  /**
   * Singleton function
   *
   * @return Instance of this class
   */
  public static CheckInternet getInstance()
  {
    if (instance == null) {
      instance = new CheckInternet();
    }

    return instance;
  }

  /**
   * Block cloning since we use singleton
   *
   * @return
   * @throws CloneNotSupportedException
   */
  @Override
  public Object clone() throws CloneNotSupportedException
  {
    throw new CloneNotSupportedException();
  }

  /**
   * Can we connect to the internet or not, checks if device has connection
   * and if wifi is on if user has set that in the connection preference
   * 
   * @param context Application context
   * @param prefs User preferences
   * @return Can connect to internet or not
   */
  @SuppressWarnings("static-access")
  public boolean canConnect(Context context, SharedPreferences prefs)
  {
    // get wifi manager
    WifiManager wifi = (WifiManager)context.getSystemService(Context.WIFI_SERVICE);

    // if wifi is disabled and the user preference only allows wifi abort
    if (wifi.getWifiState() != wifi.WIFI_STATE_ENABLED && prefs.getString("connection", "").equals(CON_WIFI)) {
      return false;
    }

    // get connectivity manager
    ConnectivityManager manager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);

    // check if we have active network and that network is connected, if not abort
    if (manager.getActiveNetworkInfo() == null || !manager.getActiveNetworkInfo().isConnected()) {
      return false;
    }

    // we can use the internet connection
    return true;
  }
}
